package cn.csc.module.product.dal.mysql.sku;

import cn.csc.framework.common.pojo.PageResult;
import cn.csc.framework.mybatis.core.mapper.BaseMapperX;
import cn.csc.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.csc.framework.mybatis.core.query.LambdaUpdateWrapperX;
import cn.csc.module.product.controller.admin.sku.vo.SkuExportReqVO;
import cn.csc.module.product.controller.admin.sku.vo.SkuPageReqVO;
import cn.csc.module.product.dal.dataobject.sku.SkuDO;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigInteger;
import java.util.List;

/**
 * sku信息 Mapper
 *
 * @author liuchuang
 */
@Mapper
public interface SkuMapper extends BaseMapperX<SkuDO> {

    default PageResult<SkuDO> selectPage(SkuPageReqVO reqVO) {
        return selectPage(reqVO, new LambdaQueryWrapperX<SkuDO>()
                .eqIfPresent(SkuDO::getSpuId, reqVO.getSpuId())
                .likeIfPresent(SkuDO::getSkuName, reqVO.getSkuName())
                .eqIfPresent(SkuDO::getAttrs, reqVO.getAttrs())
                .eqIfPresent(SkuDO::getImgUrl, reqVO.getImgUrl())
                .eqIfPresent(SkuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SkuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SkuDO::getPartyCode, reqVO.getPartyCode())
                .eqIfPresent(SkuDO::getModelId, reqVO.getModelId())
                .eqIfPresent(SkuDO::getWeight, reqVO.getWeight())
                .eqIfPresent(SkuDO::getVolume, reqVO.getVolume())
                .eqIfPresent(SkuDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(SkuDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(SkuDO::getId));
    }

    default List<SkuDO> selectList(SkuExportReqVO reqVO) {
        return selectList(new LambdaQueryWrapperX<SkuDO>()
                .eqIfPresent(SkuDO::getSpuId, reqVO.getSpuId())
                .likeIfPresent(SkuDO::getSkuName, reqVO.getSkuName())
                .eqIfPresent(SkuDO::getAttrs, reqVO.getAttrs())
                .eqIfPresent(SkuDO::getImgUrl, reqVO.getImgUrl())
                .eqIfPresent(SkuDO::getPriceFee, reqVO.getPriceFee())
                .eqIfPresent(SkuDO::getMarketPriceFee, reqVO.getMarketPriceFee())
                .eqIfPresent(SkuDO::getPartyCode, reqVO.getPartyCode())
                .eqIfPresent(SkuDO::getModelId, reqVO.getModelId())
                .eqIfPresent(SkuDO::getWeight, reqVO.getWeight())
                .eqIfPresent(SkuDO::getVolume, reqVO.getVolume())
                .eqIfPresent(SkuDO::getStatus, reqVO.getStatus())
                .betweenIfPresent(SkuDO::getCreateTime, reqVO.getCreateTime())
                .orderByDesc(SkuDO::getId));
    }

    default List<SkuDO> selectList(BigInteger supId) {
        return selectList(new LambdaQueryWrapperX<SkuDO>()
                .eqIfPresent(SkuDO::getSpuId, supId));
    }

    default int updateSku(SkuDO skuDO, BigInteger id) {
        return update(skuDO, new UpdateWrapper<SkuDO>().eq("id", id));
    }

    int delBySpuId(@Param("spuId") BigInteger spuId);

    default int updateStockBySkuId(@Param("skuId") BigInteger skuId, @Param("count") Integer count){
        LambdaUpdateWrapperX<SkuDO> updateWrapper = new LambdaUpdateWrapperX();
        updateWrapper.decreField(SkuDO::getActualStock,count);
        updateWrapper.eq(SkuDO::getId,skuId);
        return update(null,updateWrapper);
    }
}
